
import logging

from PySide6.QtCore import Signal, QObject, QMutex
from traitlets import Bool

from 程序核心代码.mvvm重构.基础定义.基础图形项.连接线.连接线图形项管理 import 连接线图形项管理
from 程序核心代码.mvvm重构.基础定义.节点管理器.动态数据调度器.带状态机的属性管理 import 状态机管理
from 程序核心代码.mvvm重构.基础定义.节点管理器.自动节点注册表 import 节点图形项匹配器

logging.basicConfig(level=logging.WARNING)  # 设置默认日志级别
日志记录器 = logging.getLogger(__name__)

class 容器节点图形项管理器(状态机管理):
    #容器内节点图形项准备就绪信号 = Signal()

    def __init__(self, 父级节点模型=None,节点模型管理器=None, 容器=None, 场景=None):
        super().__init__()
        #self.计数器 = 0
        self.调试模式 = False
        self.状态机名称 = '节点图形项管理器状态机'
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
        else:
            日志记录器.setLevel(logging.ERROR)  # 只显示警告及以上级别的日志
        self.场景 = 场景
        self.容器 = 容器
        self.父级节点模型 = 父级节点模型
        self.节点模型管理器 = 节点模型管理器
        if self.场景:
            if self.父级节点模型:
                raise ValueError("场景和父级节点模型不能同时存在")
            if self.容器:
                raise ValueError("场景和容器不能同时存在")
            self.状态机名称="无父级"+self.状态机名称
            #self.设置属性('节点可见', True)
            self.设置属性('容器被显示', True)
        elif self.父级节点模型:
            self.节点模型管理器 =  self.父级节点模型.容器节点模型管理器
            self.状态机名称="有父级"+self.状态机名称
        else:
            raise ValueError("使用容器是必须存在父级节点模型")

        #self.节点模型管理器.属性同步对象=self
        self.属性同步对象 =self.节点模型管理器
        self.连接线图形项管理器=连接线图形项管理(self)

        self.节点图形项集合 = {}
        #self.连接线图形项集合 = {}
        self.节点模型管理器.注册节点图形项管理器信号.emit(self)
        self.注册状态机(self.状态机名称)
        # 节点可见 是否应该修正为 容器父节点可见？
        self.注册状态(self.状态机名称, '初始化', 连续状态=True, 前置属性列表=['节点模型准备就绪'], 后置属性列表=['节点图形管理器准备就绪'], 动作=self.初始化节点图形项管理器)
        self.注册状态(self.状态机名称, '生成节点图形项',   连续状态=True, 前置属性列表=['节点图形管理器准备就绪', ], 后置属性列表=['节点图形项已生成'], 动作=self.生成节点图形项)
        self.注册状态(self.状态机名称, '生成连接线图形项', 连续状态=True, 前置属性列表=['节点图形项已生成','节点图形项已加载'], 后置属性列表=['连接线图形项已生成'], 动作=self.生成连接线图形项)
        self.注册状态(self.状态机名称, '加载节点图形项',   连续状态=True, 前置属性列表=['节点图形项已生成', '容器被显示'], 后置属性列表=['节点图形项已加载'], 动作=self.加载节点图形项)
        self.注册状态(self.状态机名称, '加载连接线图形项', 连续状态=True, 前置属性列表=['连接线图形项已生成', '容器被显示'], 后置属性列表=['连接线图形项已加载'], 动作=self.加载连接线图形项)
        # 防止同步意外发生
        self.获取状态机(self.状态机名称).切换状态('初始化')


    def 初始化节点图形项管理器(self):
        日志记录器.debug("初始化容器")
        if self.获取属性值('节点图形项已加载'):# 属性为空 或者为False 都是False 都不执行
            if len(self.节点图形项集合) > 0:
                if self.场景:
                    for 节点ID, 节点图形项 in self.节点图形项集合.items():
                        self.场景.移除图形项信号.emit(节点图形项)
                        del 节点图形项
                elif self.容器:
                    for 节点ID, 节点图形项 in self.节点图形项集合.items():
                        self.容器.移除图形项信号.emit(节点图形项)
                        del 节点图形项
                else:
                    raise ValueError("场景和容器不能同时为空")
                self.节点图形项集合.clear()
        self.设置属性('节点图形项已加载', False)
        self.设置属性('节点图形项准备就绪', False)
        self.设置属性('节点图形项已生成', False)
        self.获取状态机(self.状态机名称).重置状态机()
        return True  # 初始化成功

    def 生成节点图形项(self):
        日志记录器.debug(f"开始生成节点图形项{self.节点模型管理器.节点模型列表}")
        # print("节点模型管理器", 起始接口.节点模型管理器)
        for 节点模型 in self.节点模型管理器.节点模型列表:
            if 节点模型.无图形项:
                continue
            节点图形项 = 节点图形项匹配器(节点模型, 父容器节点图形项管理器=self)
            if 节点图形项 is None:
                日志记录器.error(f"未找到匹配的节点图形项 {节点模型.节点ast类型}")
                continue
            self.节点图形项集合[节点模型._节点ID] = 节点图形项
            日志记录器.debug(f"节点模型ID {节点模型._节点ID} 的图形项已准备并添加到集合中")
        if self.父级节点模型 :
            #print("存在父级节点模型 节点图形项已生成:", 起始接口.父级节点模型.__class__)
            self.父级节点模型.设置属性('容器状态', "节点图形项已生成")
            #self.容器内节点图形项准备就绪信号.emit()
        return True
    def 生成连接线图形项(self):
        for 连接线模型 in self.节点模型管理器.连接线模型集合:
            self.连接线图形项管理器.生成连接线图形项(连接线模型)
        return True
    def 加载连接线图形项(self):
        if not self.获取属性值('节点图形项已加载'):
            if self.容器:
                self.连接线图形项管理器.加载连接线图形项()
        return True
    def 加载节点图形项(self):
        日志记录器.debug("开始加载节点图形项到容器或场景")
        if not self.获取属性值('节点图形项已加载'):
            for 节点ID, 节点图形项 in self.节点图形项集合.items():
                if self.容器:
                    self.容器.添加图形项信号.emit(节点图形项)
                    日志记录器.debug(f"节点ID {节点ID} 的图形项已添加到容器中")
                elif self.场景:
                    self.场景.添加图形项信号.emit(节点图形项)
                    #节点图形项.节点可见改变信号.emit(True)
                   # print("节点可见", 节点图形项.获取属性值('节点可见'))
                    日志记录器.debug(f"节点ID {节点ID} 的图形项已添加到场景中")
                else:
                    日志记录器.error("场景和容器不能同时为空")
                    raise ValueError("场景和容器不能同时为空")
                节点图形项.节点位置更新信号.emit()

            if self.父级节点模型:
                #print("存在父级节点模型 可展开:", 起始接口.父级节点模型.__class__)
                self.父级节点模型.设置属性('容器状态', "可展开")


        return True


